home *** CD-ROM | disk | FTP | other *** search
- ;******************************************************************************
- ;******************************************************************************
- ; CODE DONE BY MAC OF PROPHECY!
- ; YOU CAN CONTACT ME AT:
- ; BBS: DARK iLLUSiON +49-(0)89-36102651 (PROPHECY WHQ)
- ; FIDONET: 2:2480/826.14
- ;******************************************************************************
- ; THiS SOURCE CODE iS FREEWARE
- ; iF YOU FiND THiS CODE USEFULL PLEASE GREET US ( PROPHECY )
- ; iF YOU USE THiS IN YOUR OWN PRODUCTIONS PLEASE GiMME THE CREDiTS
- ;******************************************************************************
- ; MY CODE iS BASED ON THE FiRE-EFFECT BY DANiEL SJOBERG
- ; BECAUSE HE USED A RANDOM PROCEDURE ( MADE BY ANONYMOUS ) AND THE
- ; SiMPLE FORMULA OF JARE/VANGELiSTEAM ( TNX )
- ; i REWROTE AND iMPROVED ALMOST EVERYTHiNG OF HiS CODE
- ;******************************************************************************
- ; THE MEMBERSTATUS OF PROPHECY IN LATE 1994
- ;
- ; CYBOMAN - MUSiC
- ; GEMiNi - CODE
- ; HUMANOiD - MUSiC
- ; MAS - CODE (UT)
- ; MAC - CODE, GFX
- ; KAOS - BBS, ORGANIZER
- ;******************************************************************************
- ;******************************************************************************
-
- .386
-
- _data segment use16 public 'data'
-
- flames db 160*100 dup (0) ;Flamemap
- banner db 'Code done by MAC of PROPHECY in 1994!',10,13
- db 'call the DARK iLLUSiON BBS: +49-(0)89-36102651'
- db 10,13,'$'
-
- _data ends
-
- _code segment use16 public 'code'
- assume cs:_code,ds:_data,ss:_stack
-
- main proc near
-
- mov ax,_data
- mov ds,ax
-
- mov ax,13h ;<- 320x200x256 gfx-mode installieren
- int 10h
-
- mov ax,pal ;<- feuerpalette installieren
- mov es,ax
-
- mov ax,1012h
- xor bx,bx
- mov cx,255
- xor dx,dx
- int 10h
-
- ;***********************************************************
- ; Main Code
- ;***********************************************************
-
- call flame ;<- flammenroutine aufrufen
-
- mov ax,3 ;<- zurück in Textmode
- int 10h
- mov ax,_data
- mov ds,ax
- mov dx,offset banner ;<- end banner ausgeben
- mov ah,9
- int 21h
- mov ax,4c00h ;<- und zurück ins dos
- int 21h
-
- main endp
-
- ;************************************************************
- ; Flammen Routine
- ;************************************************************
-
- flame proc near
- mov ax,_data
- mov ds,ax
- mov es,ax
-
- mov di,99*160 ;<- unterste zeile im feuer
- add di,5 ;<- verschiebung der punkte, um auch rand zu
- ;soften (s.u.)
- mov cx,6 ;<- anzahl der punkte (hotspots)
- hotspots:
- push di ;<- register sichern, Random proc zerstört
- push cx ;diese register
- push es
- push di
- mov ax,150 ;<- wert zwischen 0 und 150 für hotspot holen
- call random ; ^-breite des feuers
- pop di ; minus 2x verschiebung (s.o.)
- add di,ax ;<- stelle für hotspot festlegen
-
- mov ax,80 ;<- paletteneintrag für hotspot holen
- push di ;je höher desto heller (0-150)
- call random
- add ax,70 ;<- um hotspot heller zu machen
- pop di ;also um werte zwischen 70 und 150 zu bekommen
- pop es ;sonst brennt das Feuer zu niedrig
- pop cx
- mov ah,al ;<- hotspot verdoppeln
- mov [di],ax ;<- hotspot setzten (in die Flamemap)
- pop di
- loop hotspots ;<- loop um alle hotspots zu setzten
-
- mov di,320+160*30 ;<- in der 31 zeile mit dem einlesen und
- scanning_flames: ;berechnen der flamme anfangen
- xor ax,ax
- xor bx,bx
- mov bl,flames[di] ;<- einen punkt einlesen
- mov al,flames[di+160] ;<- den unten,linken und rechten benachbarten
- add bx,ax ;punkt dazu addieren
- mov al,flames[di-1]
- add bx,ax
- mov al,flames[di+1]
- add bx,ax
- shr bx,2 ;<- die quersumme davon berechnen(=soften)
- jz @@1 ;<- wenn schon 0, dann schon schwarz
- dec bx ;<- sonst um 1 dunkler machen
- @@1:
- mov flames[di-160],bl ;<- punkt in die Flamemap setzen und nach oben
- inc di ;setzten
- cmp di,160*100 ;<- nächsten punkt berechenen
- jb scanning_flames
-
- mov ax,0a000h
- mov es,ax
- mov si,offset flames
- add si,160*30
- mov di,320*60
- mov bx,66 ;<- 96 zeilen (*2..verdopplung der pixel)
- @plot_it:
- mov cx,160 ;<- mit je 160 pixel pro zeile
- @@2:
- mov al,ds:[si]
- mov ah,al
- mov es:[di],ax ;<- pixel 4mal setzten
- mov es:[di+320],ax ;damit ist der pixel um 2 getreckt
- inc si
- inc di
- inc di
- loop @@2 ;<- alle pixel der zeile setzten
-
- add di,640-320
- dec bx
- jnz @plot_it ;<- die restlichen zeilen setzten
-
- in al,60h ;<- wartet auf <esc>
- cmp al,1
- je flamme_ende ;<- dann raus
-
- jmp flame ;<- sonst wieder neue Flamme
-
- flamme_ende:
- ret
-
- flame endp
-
- ;************************************************************
- ; Initialisiert den Zufallsgenerator
- ;************************************************************
- RandSeed dd 0
-
- randomize proc near
- mov ah,2Ch
- int 21h
- mov Word ptr cs:[RandSeed],cx
- mov Word ptr cs:[RandSeed+2],dx
- ret
- randomize endp
-
- ;************************************************************
- ; Berechnet eine Zufallszahl
- ;************************************************************
- ; In: AX - Range
- ; Out: AX - Value within 0 through AX-1
- ;************************************************************
-
- random proc near
- mov cx,ax ; save limit
- mov ax,Word ptr cs:[RandSeed+2]
- mov bx,Word ptr cs:[RandSeed]
- mov si,ax
- mov di,bx
- mov dl,ah
- mov ah,al
- mov al,bh
- mov bh,bl
- xor bl,bl
- rcr dl,1
- rcr ax,1
- rcr bx,1
- add bx,di
- adc ax,si
- add bx,62e9h
- adc ax,3619h
- mov word ptr cs:[RandSeed],bx
- mov word ptr cs:[RandSeed+2],ax
- xor dx,dx
- div cx
- mov ax,dx ; return modulus
- ret
- random endp
-
- _code ends
-
- _stack segment use16 public stack 'stack'
- db 100h dup (?)
- _stack ends
-
- pal segment use16 public 'data'
- include palette.inc
- pal ends
-
- end main
-